/*
各种消息类型的定义
*/

#pragma once
#include <unordered_map>
#include <string>

namespace RpcModule
{
#define KEY_METHOD "method"       // Rpc请求方法/服务请求方法
#define KEY_PARAMS "parameters"   // Rpc请求的参数
#define KEY_TOPIC_KEY "topic_key" // 主题名称
#define KEY_TOPIC_MSG "topic_msg" // 主题消息
#define KEY_OPTYPE "optype"       // 主题类型/请求的服务类型
#define KEY_HOST "host"           // 主机
#define KEY_HOST_IP "ip"          // ip
#define KEY_HOST_PORT "port"      // 端口号
#define KEY_RCODE "rcode"         // 应答码
#define KEY_RESULT "result"       // 应答结果

    // 消息类型
    enum class MType
    {
        REQ_RPC = 0, // Rpc请求
        RSP_RPC,     // Rpc应答
        REQ_TOPIC,   // 主题方面的请求
        RSP_TOPIC,   // 主题方面的应答
        REQ_SERVICE, // 服务方面的请求
        RSP_SERVICE  // 服务方面的应答
    };

    // 应答码的具体枚举
    enum class RCode
    {
        RCODE_OK = 0,
        RCODE_PARSE_FAILED,
        RCODE_ERROR_MSGTYPE,
        RCODE_INVALID_MSG,
        RCODE_DISCONNECTED,
        RCODE_INVALID_PARAMS,
        RCODE_NOT_FOUND_SERVICE,
        RCODE_INVALID_OPTYPE,
        RCODE_NOT_FOUND_TOPIC,
        RCODE_INTERNAL_ERROR
    };
    // 应答码对应的不同信息
    static std::string ErrReason(RCode code)
    {
        static std::unordered_map<RCode, std::string> err_map = {
            {RCode::RCODE_OK, "成功处理！"},
            {RCode::RCODE_PARSE_FAILED, "消息解析失败！"},
            {RCode::RCODE_ERROR_MSGTYPE, "消息类型错误！"},
            {RCode::RCODE_INVALID_MSG, "⽆效消息"},
            {RCode::RCODE_DISCONNECTED, "连接已断开！"},
            {RCode::RCODE_INVALID_PARAMS, "⽆效的Rpc参数！"},
            {RCode::RCODE_NOT_FOUND_SERVICE, "没有找到对应的服务！"},
            {RCode::RCODE_INVALID_OPTYPE, "⽆效的操作类型"},
            {RCode::RCODE_NOT_FOUND_TOPIC, "没有找到对应的主题！"},
            {RCode::RCODE_INTERNAL_ERROR, "内部错误！"}};
        auto it = err_map.find(code);
        if (it == err_map.end())
        {
            return "未知错误！";
        }
        return it->second;
    }

    // 同步/异步执行
    enum class RType
    {
        REQ_SYNC = 0,
        REQ_ASYNC,
        REQ_CALLBACK
    };

    // 主题操作类型
    enum class TopicOptype
    {
        TOPIC_CREATE = 0, // 主题的创建
        TOPIC_REMOVE,     // 主题的删除
        TOPIC_SUBSCRIBE,  // 主题的订阅
        TOPIC_CANCEL,     // 主题的取消订阅
        TOPIC_PUBLISH     // 主题消息发布
    };

    // 服务操作类型
    enum class ServiceOptype
    {
        SERVICE_REGISTRY = 0, // 服务注册
        SERVICE_DISCOVERY,    // 服务发现
        SERVICE_ONLINE,       // 服务上线
        SERVICE_OFFLINE,      // 服务下线
        SERVICE_UNKNOW        // 未知操作
    };
}